/*
 * sgc_epoll.h
 *
 *  Created on: 2011-7-6
 *      Author: rendong01
 */

#ifndef SGC_EPOLL_H_
#define SGC_EPOLL_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<sys/epoll.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

// epoll 设置
typedef struct _sgc_epoll_socketserver_config_s sgc_epoll_socketserver_config_t;

/**
 * 新连接处理
 */
typedef void (*sgc_epoll_client_new_handler_t)(int fd, struct sockaddr_in *clientaddr, sgc_epoll_socketserver_config_t const *config);

/**
 * 读取数据
 * @buffer 缓冲
 */
typedef void (*sgc_epoll_client_msg_handler_t)(int fd, char const * buffer, int length);

/**
 *  客户端断开连接
 */
typedef void (*sgc_epoll_client_close_hander_t)(int fd);

struct _sgc_epoll_socketserver_config_s{
	char * local_addr;		// 监听的本地地址
	int port;				// 监听的端口
	int epfd;				// epoll 文件描述符
	size_t buffer_size;		// 缓冲区大小，单位byte
	int cfgmaxclients;		// 最多允许连接的客户端数

	int currentclients;			// 当前客户端数量
	int maxclients;			// 历史上面最多客户端数量

	sgc_epoll_client_new_handler_t handler_new;	// 有新连接处理函数
	sgc_epoll_client_msg_handler_t hander_read;// 读取数据
	sgc_epoll_client_close_hander_t hander_close;// 断开
};


/**
 * 启动socket服务
 */
void sgc_serversocket_start(sgc_epoll_socketserver_config_t *config);

/**
 * 设置非阻塞
 */
void setnonblocking(int sock);

ssize_t             /* Write "n" bytes to a descriptor */
writen(int fd, const void *buffer, size_t n);

#endif /* SGC_EPOLL_H_ */
